package com.powergame.controls;

import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import com.jme3.scene.control.Control;
import com.powergame.model.Piece;
import com.powergame.model.PowerGameUtils;
import com.powergame.model.Secteur;

/**
 * PieceControl.java
 *
 * Controleur pour le déplacement de la pièce sur le plateau  
 *
 * @author ToF
 */
public class PieceControl extends AbstractControl {

    private Piece piece = null;
    
    private Secteur destination = null;
    
    public static float MOVE_SPEED = 15.0f;
    
    public PieceControl(Piece p){
        this.piece = p;
    }
    
    @Override
    protected void controlUpdate(float tpf) {
        
        if(!piece.getChemin().isEmpty()){
            
            Secteur destination = null;
            int n = piece.getChemin().indexOf(piece.getPosition());
            if(n < 0){
                destination = piece.getChemin().get(0);
                
            }else if(n == (piece.getChemin().size() - 1)){
                // on est arrivé
                piece.setChemin(null);
                
            }else{
                destination = piece.getChemin().get(n + 1);
            }
            
            if(destination != null){
                // on a demandé une nouvelle destination on doit bouger
                Vector3f pos = piece.getSpatial().getLocalTranslation();
                Vector2f des = PowerGameUtils.centre(destination.getPolygone());

                if(Math.abs(pos.x - des.x) < 0.5f 
                 && Math.abs(pos.z - des.y) < 0.5f){
                    // on est arrivé
                    piece.setPosition(destination);

                }else{
                    float dx = 0;
                    float dy = 0;
                    float dz = 0;

                    if(pos.x > des.x){
                        dx = -1.0f;
                    }else if(pos.x < des.x){
                        dx = 1.0f;
                    }
                    if(pos.z > des.y){
                        dz = -1.0f;
                    }else if(pos.z < des.y){
                        dz = 1.0f;
                    }

                    piece.getSpatial().move(dx * tpf * MOVE_SPEED, dy, dz * tpf * MOVE_SPEED);
                }
            }
        }
    }

    @Override
    protected void controlRender(RenderManager rm, ViewPort vp) {
    }

    public Control cloneForSpatial(Spatial spatial) {
        return null;
    }

    public Secteur getDestination() {
        return destination;
    }

    public void setDestination(Secteur destination) {
        this.destination = destination;
    }

    public Piece getPiece() {
        return piece;
    }

    public void setPiece(Piece piece) {
        this.piece = piece;
    }
}
